package com.springboot.study.producer;
// 导入订单队列配置类，用于获取队列、交换机、路由键的常量
import com.springboot.study.config.RabbitConfigOrder;
// 导入 Spring 提供的 RabbitTemplate 类，用于发送消息到 RabbitMQ
import org.springframework.amqp.rabbit.core.RabbitTemplate;
// 导入 Spring 的注解，用于声明组件
import org.springframework.stereotype.Component;
/**
 * 订单消息生产者
 * 作用：将订单相关消息发送到 RabbitMQ 队列
 */
@Component // 将该类标记为 Spring Bean，使其可以被注入和管理
public class OrderProducer {

    // 声明 RabbitTemplate 对象，用于向 RabbitMQ 发送消息
    private final RabbitTemplate rabbitTemplate;
    /**
     * 构造函数注入 RabbitTemplate
     * Spring 会自动注入 RabbitTemplate 实例
     * @param rabbitTemplate RabbitTemplate 对象
     */
    public OrderProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }
    /**
     * 发送订单消息方法
     * @param orderId 订单ID
     */
    public void sendOrder(String orderId) {
        // 构造要发送的消息内容，这里简单拼接字符串
        String message = "订单ID：" + orderId;

        // 使用 RabbitTemplate 将消息发送到指定交换机和路由键
        // 参数说明：
        // 1. RabbitConfigOrder.ORDER_EXCHANGE ：交换机名称
        // 2. RabbitConfigOrder.ORDER_ROUTING_KEY ：路由键，DirectExchange 会根据它找到对应队列
        // 3. message ：要发送的消息内容
        rabbitTemplate.convertAndSend(
                RabbitConfigOrder.ORDER_EXCHANGE,
                RabbitConfigOrder.ORDER_ROUTING_KEY,
                message
        );
        // 控制台打印发送消息的日志，便于开发和调试
        System.out.println("订单已发送到队列: " + message);
    }
}
/*
* 每部分作用详细说明：
1、@Component
*   将该类注册为 Spring Bean，可以被注入到其他组件中。
*   生产者通常需要在业务逻辑层调用，所以注册为 Bean 后可以直接注入使用。

2、RabbitTemplate
    Spring 提供的消息发送工具类。
    支持多种发送模式（发送到队列、交换机等）。
    内部封装了 AMQP 协议的操作，开发者无需直接操作底层连接。

3、构造函数注入
*   Spring 推荐使用构造函数注入依赖。
*   保证 rabbitTemplate 在类实例化时就可用，避免空指针。

4、sendOrder 方法
*   核心功能是发送消息。
*   convertAndSend 方法会自动将 Java 对象转换为 RabbitMQ 消息（默认 JSON 或字符串）。
*   通过交换机和路由键定位到具体队列。
*   这里是 DirectExchange 模式，路由键必须完全匹配队列。

5、日志输出
*   打印发送消息内容，便于调试和验证消息是否发送成功。
*   在实际生产环境中，可替换为日志框架输出（如 Logback、Log4j2）。
*
* */